INCLUDE REG_51.PDF

SENSOR1	EQU	P1.3

RB0     EQU     000H    ; Select Register Bank 0
RB1     EQU     008H    ; Select Register Bank 1  ...poke to PSW to use

DSEG            ; This is internal data memory
ORG     20H     ; Bit adressable memory
SENP:		DS		1
SENP1		BIT	SENP.0
MINUS		BIT	SENP.1
MIN1		BIT 	SENP.2
	COUNT:	DS	1
	SPEED:	DS	1
	TEMP1:	DS	1
	TEMP1D:	DS	1
	RAM:	DS	9
	TEP1:	DS	1
	TEP2:	DS	1
STACK:  	DS      1       ; Stack begins here
CSEG          			; Code begins here
 
;---------==========----------==========---------=========---------
;              PROCESSOR INTERRUPT AND RESET VECTORS
;---------==========----------==========---------=========---------
 
ORG     0000H    	; Reset 
JMP     MAIN
ORG 	001BH		;Timer Interrupt1
JMP 	REFRESH

;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
;		MAIN PROGRAM
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
MAIN:
		MOV PSW,#RB0      	; Select register bank 0
	 	MOV SP,#STACK
		MOV SPEED,#00H
		MOV COUNT,#00H

				
		MOV  TMOD,#16H		;enable timer0 for scanning
		MOV  TL1,#00H
		MOV  TH1,#0FDH
		SETB ET1
		SETB EA
		SETB TR1		;Start the Timer


MAINS:		CALL READ_TEMP1 
		JB   SENP1,NOT_OK
		MOV  SBUF,TEMP1 	;transfer the temp data to serial port
		JNB  TI,$
		MOV  SBUF,TEMP1D	;transfer the DECIMAL temp data to serial port
		JNB  TI,$
		AJMP MAINS
		
NOT_OK:	
		MOV  SBUF,#15H
		CALL DELAY
		CALL DELAY
		CALL DELAY
		AJMP MAINS
				
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;					SENSOR 1
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
READ_TEMP1: 
	 CLR    SENP1		  ;ASSUME ALL SENSORS OK
	 MOV    A,#0CCH           ;SKIP ROM
         CALL   TEWB
         MOV    A,#044H           ;READ CONVERT
         CALL   TEWB
 	 CALL   TERES
         CALL   TECHK
         JC     ASX1		  ;JMP IF sensor PRESENT
         MOV    TEMP1,#0FFH
         MOV    TEMP1D,#0FFH
         SETB   SENP1		  ;SET FOR NO SENSOR 
         JMP    DCFG1
ASX1:    MOV    R2,#0
         DJNZ   R2,$
         CALL   TERES
         CALL   TEPRE
         MOV    R2,#0
         DJNZ   R2,$
         MOV    A,#0CCH           ;SKIP ROM
         CALL   TEWB
         MOV    A,#0BEH           ;READ SCRATCHPAD
         CALL   TEWB
         MOV    R6,#9
         MOV    R0,#RAM         
TCOTEM2: CALL   TERB		  ;Read Temperature from SCRATCHPAD
	 MOV    @R0,A
         INC    R0
         DJNZ   R6,TCOTEM2
         CALL   TERES		  ;RESET
         CALL   TEPRE
	 CALL   ds1820crc_ok
	 JNC    DCFG1		  ;jump if CRC Check failure
	 CALL   CALCULATE	
	 MOV    A,TEP1
	 CJNE   A,#85H,REP1
	 JMP    READ_TEMP1
REP1:	 MOV    TEMP1,TEP1
	 MOV    TEMP1D,TEP2
	 CLR    MIN1	          ;ASSUME +VE
	 MOV    A,RAM+1
	 JNB    ACC.0,DCFG1
	 SETB   MIN1	          ;minus temp		
DCFG1:	 RET
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;		CALCULATE TEMP FOR HIGH RESOLUTION
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~	
CALCULATE:	
			MOV A,RAM+1		;MSB restore
			RRC A
			MOV MINUS,C
			
			JNB MINUS,DLC4
			MOV A,RAM
			CPL A
			INC A
			MOV RAM,A
			
DLC4:			MOV A,RAM
			ANL A,#01H
			JZ DLC2
			DEC RAM	
	
DLC2:			MOV A,RAM
			MOV B,#50
			MUL AB
			ADD A,#25
			MOV R6,A
			MOV A,B
			ADDC A,#00H
			MOV R7,A		;LSB=R11 ,MSB=R12
			
			MOV A,RAM+7
			CLR C
			SUBB A,RAM+6
			MOV B,#100
			MUL AB
			
			ANL A,#0F0H
			SWAP A
			MOV TEP1,A
			MOV A,B
			ANL A,#0FH
			SWAP A
			ORL A,TEP1
			
			ADD A,R6
			MOV R6,A
			MOV A,R7
			ADDC A,#00H
			MOV R7,A
						
			MOV A,R6
			MOV R2,A		;CONVERT HEX VALUE TO BCD
			MOV A,R7
      			MOV R1,A
			MOV R3,#00D
      			MOV R4,#00D
      			MOV R5,#00D
      			MOV R6,#00D
      			CALL HEX2BCD	
			MOV A,R4
			SWAP A
	   		ORL A,R3
	   		MOV TEP2,A
	   		MOV A,R6
			SWAP A
	   		ORL A,R5
	   		MOV TEP1,A
	   		RET
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~		
DS1820CRC_OK:					; EXTERN BIT DS1820CRC_OK(VOID);
		MOV	R5, #9			; 8+1 BYTE CRC
		MOV	R7, #0			; CLEAR CRC REGISTER
		MOV	DPTR, #DOWCRC_TABLE
		MOV	R0, #RAM
CRC:		
		MOV	A, @R0			; SCRATCHAD VALUE
		XRL	A, R7
		MOVC	A, @A+DPTR
		MOV	R7, A
		INC	R0
		DJNZ	R5, CRC
		JZ	OK
		CLR	CY
		RET
OK:	SETB	CY
		RET
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
dowcrc_table:	DB	0, 94, 188, 226, 97, 63, 221, 131
		DB	194, 156, 126, 32, 163, 253, 31, 65
		DB	157, 195, 33, 127, 252, 162, 64, 30
		DB	95, 1, 227, 189, 62, 96, 130, 220
		DB	35, 125, 159, 193, 66, 28, 254, 160
		DB	225, 191, 93, 3, 128, 222, 60, 98
		DB	190, 224, 2, 92, 223, 129, 99, 61 
		DB	124, 34, 192, 158, 29, 67, 161, 255
		DB	70, 24, 250, 164, 39, 121, 155, 197 
		DB	132, 218, 56, 102, 229, 187, 89, 7
		DB	219, 133, 103, 57, 186, 228, 6, 88 
		DB	25, 71, 165, 251, 120, 38, 196, 154
		DB	101, 59, 217, 135, 4, 90, 184, 230 
		DB	167, 249, 27, 69, 198, 152, 122, 36
		DB	248, 166, 68, 26, 153, 199, 37, 123 
		DB	58, 100, 134, 216, 91, 5, 231, 185
		DB	140, 210, 48, 110, 237, 179, 81, 15 
		DB	78, 16, 242, 172, 47, 113, 147, 205
		DB	17, 79, 173, 243, 112, 46, 204, 146 
		DB	211, 141, 111, 49, 178, 236, 14, 80
		DB	175, 241, 19, 77, 206, 144, 114, 44 
		DB	109, 51, 209, 143, 12, 82, 176, 238
		DB	50, 108, 142, 208, 83, 13, 239, 177 
		DB	240, 174, 76, 18, 145, 207, 45, 115
		DB	202, 148, 118, 40, 171, 245, 23, 73 
		DB	8, 86, 180, 234, 105, 55, 213, 139
		DB	87, 9, 235, 181, 54, 104, 138, 212 
		DB	149, 203, 41, 119, 244, 170, 72, 22
		DB	233, 183, 85, 11, 136, 214, 52, 106 
		DB	43, 117, 151, 201, 74, 20, 246, 168
		DB	116, 42, 200, 150, 21, 75, 169, 247 
		DB	182, 232, 10, 84, 215, 137, 107, 53
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
;		SENSOR 1
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
; ********** TEPRE SUB **********
; TEMP MEMORY PRESENCE
; REG = R2
TEPRE:   JB     SENSOR1,$           ;PRESENCE (RX)
         JNB    SENSOR1,$
         MOV    R2,#8
         DJNZ   R2,$
         RET
; ********** TERES SUB **********
; TEMP MEMORY RESET
; REG = R2
TERES:   CLR    SENSOR1             ;RESET (TX)
         MOV    R2,#200             ;APP. 900 uS
TERES1:  NOP
         NOP
         DJNZ   R2,TERES1
         SETB   SENSOR1
         MOV    R2,#8
         DJNZ   R2,$
         RET
; ********** TECHK SUB **********
; TEMP MEMORY CHECK PRESENCE AT FIRST
; OUT = CY  0=NO 1=OK
; REG = R2,R3
TECHK:   MOV    R2,#8
TECHK1:  MOV    R3,#0
TECHK2:  JNB    SENSOR1,TECHK5      ;PRESENCE (RX)
         DJNZ   R3,TECHK2
         DJNZ   R2,TECHK1
         CLR    C
         RET
TECHK5:  JNB    SENSOR1,$
         MOV    R2,#8
         DJNZ   R2,$
         SETB   C
         RET
; ********************************************************
; TEMP MEMORY WRITE BYTE
; IN  = A
; REG = A,R2,R3
; ********************************************************
TEWB:    MOV    R3,#8             ;WRITE BYTE
TEWB1:   RRC    A
         JC     TEWB2
         CALL   TEW0
         SJMP   TEWB3
TEWB2:   CALL   TEW1
TEWB3:   DJNZ   R3,TEWB1
         RET

TEW0:    CLR    SENSOR1           ;WRITE 0
         MOV    R2,#15            ;65 uS
TEW01:   NOP
         NOP
         DJNZ   R2,TEW01
         SETB   SENSOR1
         NOP                      ;4 uS
         NOP
         NOP
         NOP
         RET

TEW1:    CLR    SENSOR1           ;WRITE 1
         NOP                      ;4 uS
         NOP
         NOP
         NOP
         SETB   SENSOR1
         MOV    R2,#15            ;65 uS
TEW11:   NOP
         NOP
         DJNZ   R2,TEW11
         RET
; ********** TERB SUB **********
; TEMP MEMORY READ BYTE
; OUT = A
; REG = A,R2,R3

TERB:    MOV    R3,#8             ;READ BYTE
TERB1:   CALL   TEBIT
         RRC    A
         DJNZ   R3,TERB1
         RET

TEBIT:   CLR    SENSOR1           ;READ BIT
         NOP
         NOP
         SETB   SENSOR1
         NOP
         NOP
         NOP
         NOP
         MOV    C,SENSOR1
         MOV    R2,#15            ;65 uS
TEBIT2:  NOP
         NOP
         DJNZ   R2,TEBIT2
         RET
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$

;**********************************************************	

DELAY1:
	MOV R0,#05H
REPA2:	MOV R1,#99H
REPA1:	NOP
	DJNZ R1,REPA1
	DJNZ R0,REPA2
	RET
;**************************************************	
;**************************************************	
HEX2BCD: 
	MOV B,#10D
        MOV A,R2
        DIV AB
        MOV   R3,B              ;   
        MOV   B,#10             ; R7,R6,R5,R4,R3
        DIV   AB
        MOV   R4,B
        MOV   R5,A
        CJNE R1,#0H,HIGH_BYTE   ; CHECK FOR HIGH BYTE
        SJMP ENDD
 
HIGH_BYTE:
			MOV   A,#6
        		ADD   A,R3
			MOV   B,#10
			DIV   AB
        		MOV   R3,B
			ADD   A,#5
        		ADD   A,R4
			MOV   B,#10
			DIV   AB
        		MOV   R4,B
			ADD   A,#2
        		ADD   A,R5
			MOV   B,#10
			DIV   AB
        		MOV   R5,B
        		CJNE R6,#00D,ADD_IT
        		SJMP CONTINUE
ADD_IT:
        		ADD A,R6
CONTINUE:
       	 		MOV R6,A
       			DJNZ R1,HIGH_BYTE
       	 		MOV B, #10D
      	 		MOV A,R6
       	 		DIV AB
       	 		MOV R6,B
       	 		MOV R7,A
ENDD:  	 		RET
;***************************************************************************
;**********************************************************
DELAY:
	MOV R1,#0FFH
REP2:	MOV R6,#0FFH
RAP1:	NOP
	DJNZ R6,RAP1
	DJNZ R1,REP2
	RET
;**********************************************************	
DELAYS:
	MOV R1,#0FFH
REPS:	
	DJNZ R1,REPS
	RET
	END
			        
 
 
